#pragma once
#include <string>
#include <signal.h>
#include <functional>
#include "log.hpp"
#include "Socket.hpp"

using namespace std;
using func_t = std::function<std::string(std::string &package)>;
class server
{
public:
    server(uint16_t port, func_t fun)
    :_port(port), _fun(fun)
    {
    }

    void init()
    {
        //创建套接字
        _listensocket.Socket();
        int opt = 1;
        setsockopt(_listensocket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));
        _listensocket.Bind(_port);
        _listensocket.Listen();

        lg.logmessage(info, "init server done");
    }

    void start()
    {
       // signal(SIGCHLD, SIG_IGN);
       // signal(SIGPIPE, SIG_IGN);
       // while (true)
       // {
       sleep(8);
            string ip;
            uint16_t port;

            int sockfd = _listensocket.Accept(&ip, &port);
            if (sockfd < 0)
            {
            
            }

            lg.logmessage(info, "get a new link %d", sockfd);

            sleep(5);
            close(sockfd);
       //     if (fork() == 0)
       //     {
       //         _listensocket.Close();
       //         string inbuff_stream;
       //         // 提供服务
       //         while (true)
       //         {
       //             char buff[1280];
       //             ssize_t n = read(sockfd, buff, sizeof(buff));
       //             if (n > 0)
       //             {
       //                 buff[n] = 0;
       //                 lg.logmessage(debug, "\n%s", buff);
       //                 inbuff_stream += buff;
       //                 while (true)
       //                 {
       //                     string echo = _fun(inbuff_stream);
       //                     if (echo.empty())
       //                     {
       //                         break;
       //                     }

       //                     write(sockfd, echo.c_str(), echo.size());
       //                 }
       //                
       //             }
       //             else if (n == 0)
       //             {
       //                 break;
       //             }
       //             else
       //             {
       //                 break;
       //             }
       //         }
       //         exit(0);
       //     }

       //     close(sockfd);
       // }

      // close(sockfd);
    }

    ~server()
    {

    }
private:
    Sock _listensocket;
    uint16_t _port;
    func_t _fun;
};
